/**
 * 获取输入文本的嵌入向量
 *
 * @param {string|string[]} input - 输入文本，可以是单个字符串或字符串数组
 *
 * @returns {Promise<number[][]>} - 返回嵌入向量数组，每个向量截取前 512 个元素
 */
async function vectorGetEmbedding(input) {
	// 检查是否允许进行向量嵌入操作
	if (!vectorAllowEmbedding) return [];
	// 尝试获取嵌入向量
	try {
		/**
		 * 如果输入不是数组，则将其转换为包含单个元素的数组
		 */
		const texts = Array.isArray(input) ? input : [input];
		/**
		 * 调用 contactEmbeddingModel 函数与嵌入模型进行交互
		 */
		const response = await contactEmbeddingModel(embeddingEndpointUrl, embeddingEndpointKey, embeddingModelDropdown, texts, false);
		// 如果响应失败，则设置禁止进行向量嵌入操作
		if (!response.ok) throw new Error(`获取向量嵌入失败: ${response.status} ${response.statusText}`);
		/**
		 * 解析响应数据为 JSON 格式
		 */
		const data = await response.json();
		/**
		 * 从嵌入模型数据中提取嵌入向量
		 *
		 * @param {*} item 嵌入模型数据项
		 *
		 * @returns 截取后的嵌入向量
		 */
		function dataExtraction(item) {
			// 检查嵌入向量是否存在且为数组类型
			if (!item.embedding || !Array.isArray(item.embedding)) throw new Error('嵌入模型数据格式错误');
			// 截取嵌入向量的前 512 个元素
			return item.embedding.slice(0, 512);
		};
		// 提取每个嵌入向量并截取前 512 个元素
		return data.data.map(dataExtraction);
	}
	// 捕获异常并显示错误信息
	catch (error) {
		showSystemMessage(`${error.name} | ${error.message} | ${error.stack}`, "error");
		vectorAllowEmbedding = false;
		return [];
	}
};

/**
 * 向量嵌入的回退策略，用于从对话历史中提取有效内容
 *
 * @returns {Object[]} - 返回处理后的对话内容数组，每个内容截取前 1024 个字符
 */
function vectorFallbackStrategy() {
	/**
	 * 过滤出对话历史中内容不为空的消息
	 */
	const valid = conversationHistory.filter(msg => msg.content && msg.content.trim().length > 0);
	/**
	 * 如果有效消息数量小于等于默认最大数量，则全部使用，否则取最后默认最大数量的消息
	 */
	const content = valid.length <= vectorDefaultTopK ? valid : valid.slice(-vectorDefaultTopK)
	// 截取每个消息内容的前 1024 个字符并返回
	return content.map(item => ({ role: item.role, content: cleanTextForTTS(item.content).slice(0, 1024) }));
};